package com.example.common.utils;

import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class StringUtil {
    
    /**
     * 字符串是否为空（null或只包含空格）
     */
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
    
    /**
     * 将 null 转换为 ""
     */
    public static String nullToEmpty(String str) {
        return str == null ? "" : str;
    }
    
    /**
     * 两个字符串是否相等（忽略大小写）
     */
    public static boolean equalsIgnoreCase(String s1, String s2) {
        if (s1 == null || s2 == null) return false;
        return s1.equalsIgnoreCase(s2);
    }
    
    /**
     * 将字符串首字母大写
     */
    public static String capitalize(String str) {
        if (isEmpty(str)) return str;
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
    
    /**
     * 将字符串首字母小写
     */
    public static String uncapitalize(String str) {
        if (isEmpty(str)) return str;
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }
    
    /**
     * 将集合转换为以逗号分隔的字符串
     */
    public static String join(Collection<?> collection) {
        if (collection == null || collection.isEmpty()) return "";
        return join(collection, ",");
    }
    
    /**
     * 将集合转换为指定分隔符的字符串
     */
    public static String join(Collection<?> collection, String delimiter) {
        if (collection == null || collection.isEmpty()) return "";
        return collection.stream()
                          .map(Object::toString)
                          .collect(Collectors.joining(delimiter));
    }
    
    /**
     * 截取指定长度字符串，超出部分添加省略号
     */
    public static String truncate(String str, int maxLength) {
        if (isEmpty(str) || str.length() <= maxLength) return str;
        return str.substring(0, maxLength) + "...";
    }
    
    /**
     * 判断字符串是否是数字
     */
    public static boolean isNumeric(String str) {
        if (isEmpty(str)) return false;
        return str.matches("\\d+");
    }
    
    /**
     * 验证字符串是否为合法邮箱地址
     */
    public static boolean isEmail(String str) {
        if (isEmpty(str)) return false;
        String regex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$";
        return str.matches(regex);
    }
    
    /**
     * 移除字符串中的所有非字母数字字符（保留中文、字母、数字）
     */
    public static String removeSpecialChars(String str) {
        if (isEmpty(str)) return str;
        return str.replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9]", "");
    }
    
    /**
     * 去除所有空白字符
     */
    public static String removeAllWhitespace(String str) {
        if (str == null) return null;
        return str.replaceAll("\\s+", "");
    }
    
    /**
     * 正则提取匹配内容（仅提取第一个匹配）
     */
    public static String extractByRegex(String str, String regex) {
        if (isEmpty(str)) return null;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }
    
    /**
     * 字符串重复
     */
    public static String repeat(String str, int count) {
        if (str == null || count <= 0) return "";
        return str.repeat(count);
    }
}
